package pruebas;

import modelo.*;
import modelo.armas.*;
import modelo.moviles.exceptions.ArsenalSinArmas;
import modelo.moviles.exceptions.Excepciones_TP;
import modelo.moviles.balas.Bala;
import junit.framework.TestCase;

public class TestArsenal extends TestCase {

	/* "testea el Arsenal" */
	public void testArsenal(){

	Nivel nivel = new Nivel (10 ,12);
	Arsenal arsenal = new Arsenal();
	Bala bala;
			
	/* "cuando inicia el arsenal no debe tener armas" */
	assertFalse("El arsenal no fue bien creado" ,arsenal.tieneArmas());


	/* "agrego un arma y pruebo si ahora tiene armas" */
	arsenal.agregarArma(new Laser(nivel));
	assertTrue("El arsenal no guarda las armas" ,arsenal.tieneArmas());
	
	/* "pruebo si anda el armaActiva, al pedirle a esa arma que pueda disparar" */	
	assertTrue("El arsenal no puede disparar por mas que tenga un arma cargada" ,arsenal.armaActiva().puedeDisparar());

	/* Empezamos el try que debera saltar en el ultimo caso */
	try {
		/* "pruebo si dispara el armaActiva." */	
		bala = arsenal.armaActiva().disparar();
		assertEquals("El arsenal no dispara la bala adecuada",bala.getIntensidad(), 30);
	
		/* "descarto un arma y pruebo si ahora tiene armas" */
		arsenal.descartarArma();
		assertFalse("El arsenal no descarta las armas" ,arsenal.tieneArmas());
	
		/* "agrego dos armas y pruebo si la prepara para disparar"*/ 
		arsenal.agregarArma(new Cohete (nivel));
		arsenal.agregarArma(new Cohete (nivel));
		
		assertTrue("El arsenal no preparo un arma cargada", arsenal.preparoArmaCargada());
	
		/* "disparo y me tiene que dar una bala Cohete cuya intensidad es 100" */
		bala = arsenal.disparar();
		assertEquals("El arsenal no dispara la bala adecuada",bala.getIntensidad(),100);
	
		/* "disparo una segunda bala para dejar el Arsenal sin balas" */
		bala = arsenal.disparar();
	
		/* "si intento disparar debe dar un error por no tener armas cargadas" */
		bala = arsenal.disparar();
		fail("El arsenal pudo disparar sin tener armas cargadas");
	} catch (Excepciones_TP e) {
	    	/* Esta parte esta de mas, solo queria probar la excepcion.*/
	}
		
	/* "como todavia tiene otra arma puede prepararse para disparar" */
	assertTrue("El arsenal no preparo un arma cargada",arsenal.preparoArmaCargada());


	/* Empezamos el try que debera saltar en el ultimo caso */
	try {
		/* "disparo dos balas" */
		bala = arsenal.disparar();
		bala = arsenal.disparar();
	} catch (ArsenalSinArmas e) {
    	System.err.println(e.getDetalle());
	}

		/* "a esta altura todavia tiene armas"*/ 
		assertTrue("El arsenal no guarda las armas",arsenal.tieneArmas());

		/* "ya no puede preparar un arma cargada" */
		assertFalse("El arsenal preparo un arma cargada sin tener balas disponibles",arsenal.preparoArmaCargada());

		/* "a esta altura ya no tiene armas"*/ 
		assertFalse("El arsenal no guarda las armas",arsenal.tieneArmas());
	}
}
